%option noyywrap nodefault
%option yylineno

%{
#include "parser.tab.hh"
#include <cstdlib>
#include <string>

#define YY_DECL yy::parser::symbol_type yylex()
%}

%%

"->" {return yy::parser::make_RIGHT_ARROW();}

";"  {  return yy::parser::make_EOL();  }

"int"  {  return yy::parser::make_INT();  }

"char"  {  return yy::parser::make_CHAR();  }

"void"  {  return yy::parser::make_VOID();  }

"struct"  {  return yy::parser::make_STRUCT();  }

"input"  {  return yy::parser::make_INPUT();  }

"output"  {  return yy::parser::make_OUTPUT();  }

"return"  {  return yy::parser::make_RETURN();  }

"if"  {  return yy::parser::make_IF();  }

"else"  {  return yy::parser::make_ELSE();  }

"while"  {  return yy::parser::make_WHILE();  }

"for"  {  return yy::parser::make_FOR();  }

"break"	{ return yy::parser::make_BREAK(); }

"continue" { return yy::parser::make_CONTINUE(); }

"switch" { return yy::parser::make_SWITCH(); }

"case"	{return yy::parser::make_CASE(); }

"default" { return yy::parser::make_DEFAULT(); }

[_A-Za-z]([_A-Za-z]|[0-9])*  {  
	return yy::parser::make_IDENTIFIER(std::string(yytext));
}

[0-9]+	{
	return yy::parser::make_INTEGER(atoi(yytext));
}

\"[^\"]*\"  {
	return yy::parser::make_TEXT(std::string(yytext + 1, yytext + strlen(yytext) - 1));
}

\'[^']\'  {
    return yy::parser::make_CHARACTER(yytext[1]);
}

"=="  {  return yy::parser::make_EQ();  }

"!="  {  return yy::parser::make_NE();  }

"<="  {  return yy::parser::make_LE();  }

"<"  {  return yy::parser::make_LT();  }

">="  {  return yy::parser::make_GE();  }

">"  {  return yy::parser::make_GT();  }

[ \t\r\n]|#.*

. 	{	return yy::parser::symbol_type(yytext[0]); }

%%

